package com.dp.singleton;

/**
 * <p>Title: 懒汉式单例（线程不安全）</p>
 * <p>Description:
 * @author 公众号：小白架构师养成记
 * @version 1.0
 * @date 2020/6/30
 */
public class LazySingleton01 {

    /****
     * volatile 保证 instance 在所有线程中同步
     */
    private static LazySingleton01 instance;

    /***
     * private 避免类在外部被实例化
     */
    private LazySingleton01() {}

    /****
     *  创建对象
     *
     *  缺点：绝大部分的耗时都用在synchronized修饰符的同步准备上，因此从性能上来说很不划算
     * @return 单例对象
     */
    public static LazySingleton01 getInstance() {
        if (instance == null) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            instance = new LazySingleton01();
        }
        return instance;
    }

    /****
     * 模拟多线程下并发测试
     * @param ags
     */
    public static void main(String[] ags){
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            new Thread(new Runnable() {
                public void run() {
                    LazySingleton01 lazySingleton01 = LazySingleton01.getInstance();
                    System.out.println(Thread.currentThread().getName() + lazySingleton01);
                }
            }).start();
        }
        long end = System.currentTimeMillis();
        System.out.println("总耗时：" + (end - start));
    }
}
